/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agencia;

import java.io.Serializable;
import javax.persistence.Entity; //Pasa clase a tabla
import javax.persistence.Id;
import javax.persistence.GeneratedValue; //Forma que se generan los ids
import javax.persistence.GenerationType; //Typos de datos

import javax.persistence.Table; //Personalizar nombre de tabla sino idem class
import javax.persistence.Transient; //para atributos que se equiran NO persistir
import javax.persistence.Column; //Personalizar nombre de columna en tabla sino idem class

import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.ManyToOne;
import javax.persistence.JoinColumn;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import org.hibernate.*;

/**
 *
 * @author martin
 */
@Entity
public class Cliente {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long idCliente;
    private int numeroCliente;
    private String nombre;
    private String apellido;
    private String nickname;
    private Date nacimiento;
    private String direccion;

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinColumn()//nullable=true x defecto, especifica q puede haber objetos sin fk
    private List<Telefono> telefonos = new ArrayList<Telefono>();

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="cliente")
    private List<Boleta> boletas = new ArrayList<Boleta>();

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinColumn()//nullable=true x defecto, especifica q puede haber objetos sin fk
    private List<Compra> compras = new ArrayList<Compra>();

    @ManyToOne
    private CuentaCorriente cuentaCorriente;

    public int getNumeroCliente() {
        return numeroCliente;
    }

    public void setNumeroCliente(int numeroCliente) {
        this.numeroCliente = numeroCliente;
    }
    
    public Cliente() {
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    
    public long getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(long idCliente) {
        this.idCliente = idCliente;
    }

    
    public Date getNacimiento() {
        return nacimiento;
    }

    public void setNacimiento(Date nacimiento) {
        this.nacimiento = nacimiento;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public List<Telefono> getTelefonos() {
        return telefonos;
    }

    public void setTelefonos(List<Telefono> telefonos) {
        this.telefonos = telefonos;
    }

    public List<Boleta> getBoletas() {
        return boletas;
    }

    public void setBoletas(List<Boleta> boletas) {
        this.boletas = boletas;
    }

    public List<Compra> getCompras() {
        return compras;
    }

    public void setCompras(List<Compra> compras) {
        this.compras = compras;
    }

    public String toString () {
    //Lo que se muestra en el JList sale de implementar este metodo
            String line;
            
            
            line=this.getApellido()+" "+this.getNombre()+" ("+String.valueOf(this.getNumeroCliente())+")";

            return line;
    }

    public static Cliente buscarCliente (long id) {
        Session session = HibernateUtil.getMySession();
        
        String hql = "from Cliente Cliente where numeroCliente="+String.valueOf(id);
        Query query = session.createQuery(hql);
        query.setMaxResults(1);
        Cliente cliente = (Cliente) query.uniqueResult();
        Query q = session.createQuery(hql); //1ero tipo despues tabla [where]
        return cliente;


    }

        public static List<Cliente> buscarClientes (String aString) {
        Session session = HibernateUtil.getMySession();
/*
        String hql = "from Cliente Cliente where nombre like '"+aString+"%'"
                + " or apellido like '"+aString+"%'"
                + " or numeroCliente like '"+aString+"%' ";
*/
        
        String hql = "from Cliente Cliente where nombre||' '||apellido like '%"+aString+"%'"
                + "or apellido||' '||nombre like '%"+aString+"%'" 
                + " or numeroCliente like '"+aString+"%' ";
        
        Query query = session.createQuery(hql);
        //query.setMaxResults(5);
        List<Cliente> clientes = query.list();
        Query q = session.createQuery(hql); //1ero tipo despues tabla [where]
        return clientes;


    }

    public void persist () {
        Session session = HibernateUtil.getMySession();
        session.beginTransaction();
        session.persist(this);
        session.getTransaction().commit();
    }
}
